/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package xmlaufgabe3;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * View nach MVC Pattern. Stellt ein Konto mit Ausgabe des Kontostandes, sowie
 * Eingabemoeglichkeiten fuer Ein- und Auszahlung dar.
 * 
 * @author Adrian Cieluch
 * @version 1.0, 11/3/11
 */
public class AccountView extends JPanel implements Observer {
    /**
     * Speichert das Model
     */
    private AccountModel model;
    
    /**
     * Textfeld des Kontostandes
     */
    private JTextField balance;
    
    /**
     * Textfeld zur Einzahlung
     */
    private JTextField deposit;
    
    /**
     * Textfeld zur Auszahlung
     */
    private JTextField withdrawal;
    
    /**
     * Farbe des Kontos
     */
    private Color accountColor;
    
    /**
     * ID des Kontos
     */
    private String accountID;
    
    /**
     * Macht das Model bekannt, initialisiert ID, Farbe sowie die Textfeldkomponenten.
     * 
     * @param m AccountModel
     * @param i Index des Kontos
     */
    public AccountView(AccountModel m, int i) {
        model = m;
        accountID = model.getAccountIdByIndex(i);
        accountColor = model.getColorByID(accountID);
        
        balance = new JTextField();
        balance.setEditable(false);
        balance.setText(Double.toString(model.getAccountBalanceByID(accountID)));
        deposit = new JTextField();
        withdrawal = new JTextField();
        
        this.setBorder(BorderFactory.createEtchedBorder());
        
        initInterface();
    }
    
    /**
     * Initialisiert das Konteninterface und alle zugehörigen Komponenten.
     */
    public void initInterface() {
        JLabel account = new JLabel("Konto Nr. " + accountID);
        account.setForeground(accountColor);
        account.setHorizontalTextPosition(JLabel.CENTER);
        account.setVerticalTextPosition(JLabel.TOP);
        account.setVisible(true);
        
        JPanel mainPane = new JPanel();
        mainPane.setLayout(new GridLayout(3, 3, 10, 10));
        
        this.add(new Box.Filler(new Dimension(1, 20), new Dimension(1, 20), new Dimension(1, 20)));
        this.add(account);
        this.add(new Box.Filler(new Dimension(1, 30), new Dimension(1, 30), new Dimension(1, 30)));
        this.add(mainPane);
        
        mainPane.add(new JLabel("Kontostand:"));
        mainPane.add(balance);
        mainPane.add(new JLabel("Euro"));
        mainPane.add(new JLabel("Einzahlung:"));
        mainPane.add(deposit);
        mainPane.add(new JLabel("Euro"));
        mainPane.add(new JLabel("Auszahlung:"));
        mainPane.add(withdrawal);
        mainPane.add(new JLabel("Euro"));
    }
    
    /**
     * Fuegt den Ein-/Auszahlungstextfeldern ActionListener hinzu.
     * 
     * @param e Listener
     */
    public void addInputActionListener(ActionListener e) {
        deposit.addActionListener(e);
        withdrawal.addActionListener(e);
    }
    
    /**
     * Gibt den eingegeben Einzahlungsbetrag zurueck.
     * 
     * @return Einzahlungsbetrag
     */
    public String getDepositInput() {
        return deposit.getText();
    }
    
    /**
     * Loescht den Einzahlungsbetrag.
     */
    public void clearDepositInput() {
        deposit.setText("");
    }
    
    /**
     * Gibt den eingegeben Auszahlungsbetrag zurueck.
     * 
     * @return Auszahlungsbetrag
     */
    public String getWithdrawalInput() {
        return withdrawal.getText();
    }
    
    /**
     * Loescht den Auszahlungsbetrag
     */
    public void clearWithdrawalInput() {
        withdrawal.setText("");
    }
    
    /**
     * Gibt die ID des Kontos zurueck.
     * 
     * @return ID des Kontos
     */
    public String getAccountID() {
        return accountID;
    }
    
    /**
     * Updatemethode des Observers. Aktualisiert bei Aenderung des Models den
     * Kontostand.
     * 
     * @param obs Das zu beobachtende Model
     * @param obj Beliebiges Objekt
     */
    @Override
    public void update(Observable obs, Object obj) {
        AccountModel model = (AccountModel)obs;
        
        balance.setText(Double.toString(model.getAccountBalanceByID(accountID)));
    }
    
}
